package cn.yll.common.utils;

import com.alibaba.fastjson2.JSON;
import cn.yll.common.constant.MyConstants;
import lombok.extern.slf4j.Slf4j;
import jodd.util.RandomString;
import org.springframework.util.StringUtils;

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.*;
import java.util.regex.Pattern;

/**
 * @author yangll
 */
@Slf4j
public class CommonUtil {
    private static final Random RANDOM = new Random();
    private static final Pattern PHONE_PATTERN = Pattern.compile("^1\\d{10}$");
    private static final Pattern NUM_PATTERN = Pattern.compile("[0-9]+");

    private static final String randString = "234CGHJK56XY79FQ23LMN569AP23CD56ERS794TUVW56789ABZ234cghjk56xy79fq23lmn569ap23cd56ers794tuvw56789abz";


    /**
     * 返回[0, bound)之间的随机数,不包括bound值
     *
     * @param bound 大于0的最大边界数
     * @return 0到bound之间的随机数, 包括0, 不包括bound值
     */
    public static int nextInt(int bound) {
        if (bound <= 1) {
            return 0;
        }
        return RANDOM.nextInt(bound);
    }

    /**
     * 根据长度生成length位随机数码
     *
     * @param length 数码长度
     */
    public static String randomNumStr(int length) {
        return RandomString.get().randomNumeric(length);
    }

    /**
     * 根据长度生成length位只有数字和大小写字母的随机码
     * @param length 数码长度
     */
    public static String randomStr(int length) {
        return RandomString.get().random(length, randString);
    }

    /**
     * 手机号验证
     *
     * @param str 手机号
     * @return 验证不通过返回true
     */
    public static boolean correctMobile(String str) {
        if (!StringUtils.hasText(str) || str.length() != MyConstants.PHONE_LENGTH) {
            return true;
        }
        // 验证手机号
        return !PHONE_PATTERN.matcher(str).matches();
    }

    /**
     * 格式化11手机号显示3空格4空格4
     * @param mobile 11位手机号
     */
    public static String formatMobileNum(String mobile) {
        if (correctMobile(mobile)) {
            return mobile;
        }
        return mobile.substring(0, 3) + " " + mobile.substring(3, 7) + " " + mobile.substring(7, 11);
    }

    /**
     * 把传入的毫秒数转为x天x小时x分钟
     * time > 1天，转为x天x时
     * 1小时 < time < 1天，转为x时x分
     * time < 1小时，转为x分钟
     *
     * @param time 毫秒数
     */
    public static String parseTime(Long time) {
        if (Objects.isNull(time) || time <= 0) {
            return "";
        }
        long day = 86400000L;
        long hour = 3600000L;
        long m = 60000L;
        if (time >= day) {
            return (time / day) + "天" + (time % day / hour) + "时";
        } else if (time >= hour) {
            return (time / hour) + "时" + (time % hour / m) + "分";
        } else {
            return (time / m) + "分";
        }
    }

    /**
     * 把传入的毫秒数转为特定的日期格式
     * time 不是本年 yyyy-MM-dd
     * time 是本年不是今天 MM-dd
     * time 是今天 mm:SS
     */
    public static String formatTime(Long time) {
        if (Objects.isNull(time) || time <= 0) {
            return "";
        }
        LocalDate curDate = LocalDate.now();
        Date date = new Date(time);
        Calendar now = Calendar.getInstance();
        Calendar ori = Calendar.getInstance();
        ori.setTimeInMillis(time);
        if (now.get(Calendar.YEAR) != ori.get(Calendar.YEAR)) {
            //不是本年
            return new SimpleDateFormat(MyConstants.DEFAULT_DATE_FORMAT).format(new Date(time));
        } else if (now.get(Calendar.DATE) != ori.get(Calendar.DATE)) {
            //是本年不是今天
            return new SimpleDateFormat("MM-dd").format(new Date(time));
        } else {
            //是今天
            return new SimpleDateFormat("HH:mm").format(new Date(time));
        }
    }

    /**
     * 生成用户token值
     */
    public static String createToken() {
        return UUID.randomUUID().toString().replace("-", "");
    }

    /**
     * 检查登录密码
     * @param password 登录密码
     * @return ture密码可用 false格式错误
     */
    public static boolean checkPassword(String password) {
        return !StringUtils.hasText(password) || password.length() < 8 || password.length() > 12;
    }

    /**
     * 获取当前系统时间字符串
     * @return yyyy-MM-dd HH:mm:ss格式当前系统时间
     */
    public static String curStandardTime() {
        return new SimpleDateFormat(MyConstants.DEFAULT_DATE_TIME_FORMAT).format(new Date());
    }

    /**
     * 填充字符串模版
     * @param template 模版
     * @param params 参数array列表
     */
    public static String formatString(String template, String params) {
        if (!StringUtils.hasText(template)) {
            return "";
        }
        if (!StringUtils.hasText(params)) {
            return template;
        }
        try {
            return String.format(template, JSON.parseArray(params).toArray());
        } catch (Exception e) {
            log.error("转换站内信信息实体异常", e);
            return "";
        }
    }

    /**
     * 判断字符串不是数字
     * @param target 要验证的字符串
     * @return true 不是数字 false是数字
     */
    public static boolean notNum(String target) {
        if (!StringUtils.hasText(target)) {
            return true;
        }
        return !NUM_PATTERN.matcher(target).matches();
    }
}
